約 1,898,681 件
https://w.atwiki.jp/mini98/pages/21.html
VB6のCollectionクラスは便利です。 あるクラスを配列で格納しようと思ったら、配列長の確保が必要ですし、可変長にはできません。Redim Preserveで可変長を実現できなくもないのですが、メモリのフラグメント化を引き起こしてしまいそうなのが嫌でめったに使いません。Collectionクラスはaddするだけでどんどんサイズを変えていきます(本当はメモリのフラグメントを起こしているのかもしれませんが、精神衛生上それが見えないので良いです)。 また、VB6のコレクションクラスは、Javaでいうハッシュマップのような機能も実現します。addする時に、キーを一緒に入れておけば、キーで取り出す事ができます。 まずはフォームにこのようなテキストボックスを作成して下さい。 imageプラグインエラー ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (コレクションクラス.png) そして、フォームに次のようなコードを記述して下さい。 Option Explicit Private col As Collection Private Sub Command1_Click() Dim txtTemp As TextBox Err.Clear On Error Resume Next Set txtTemp = col.Item(Text1.Text) If Err.Number 0 Then Set txtTemp = Nothing End If On Error GoTo 0 If txtTemp Is Nothing Then Text4.Text = "見つかりませんでした" Else Text4.Text = txtTemp.Text End If End Sub Private Sub Form_Load() Set col = New Collection Call col.Add(Text1, Text1.Text) Call col.Add(Text2, Text2.Text) Call col.Add(Text3, Text3.Text) End Sub 実行し、コマンドボタンを押すと、Text4にText1の内容が表示されます。もし、Text1の内容を書き換えると「見つかりませんでした」と表示します。 ここでは簡単な例なので、何に使えば良いか思いつかないかもしれませんが、自動可変長配列であり、辞書のような機能を持つのですから、使い勝手は良いと言えます。実際、私も様々なケースで利用します。 しかしこの便利なコレクションクラスも、泣き所があります。というのは、どんなクラスでも格納できてしまうという所です。クラス内やメソッド内で使用するなら良いのですが、public なメソッドで、引数や戻り値に使用するのはお勧めできません。中にどのようなデータ型が入っているかわからなくなるからです。間違って取り出してしまった場合でも、コンパイルで引っかかるというような事がありません。 Javaも、ArrayListやLinkedListでは何でも格納できるのですが、Java5より静的型付け(generics)が導入され、特定の型に絞ってaddできるようになりました。これにより、間違っていたらコンパイル段階で引っかかるようになりました。 VB6での開発では、泣く泣く引数や戻り値には、配列を使用しています。 追記 正確には、クラスビルダユーティリティにて、特定のクラス型に限って格納できるコレクションクラスを作成できます。ですが…やはりパッケージの仕組みがないVB6では、クラスの増えすぎも抑制したいので、新規のコレクション作成も控えたいように思います。ので、結局は配列を使う事にしています。 @
https://w.atwiki.jp/mini98/pages/19.html
VB6のテキストを見るとハンガリアン記法でコーディングされている例が多く見当たります。そのハンガリアン記法もアプリケーションハンガリアンではなく、システムハンガリアンです。Integer型であればintHogeで、Long型ならばlngFoo、String型ならばstrAyayaのように。プレフィックスかサフィックスの形で簡単にデータ型を付けています。 古いメインフレーム系時代のプログラムの多くもシステムハンガリアンでコーディングされている例が多いです。そういう古い時代からやってきた技術者の多くは「変数を一目見ただけで、データ型が何であるかわかる」と言います。 メインフレーム系のプログラムには、一つのサブルーチンで数千行にわたるコードがあるというのも珍しくありません。プログラムの先頭で変数を宣言し、その後に数千行にわたるコードがあるわけですから、最初の宣言を確かめるのも一苦労です。そのような時代なら、システムハンガリアンも意味があったと思います。 現在、IDEを利用してプログラミングするのが普通の時代になり、データ型を誤って代入したりすると、コンパイルエラーが生じます。どの箇所で誤っているかをIDEが教えてくれます。 また、コードを短く書くという事も常識的になり、あえてシステムハンガリアンで書くメリットも無いように思います。 さらに、仕様変更によりデータ型が変わってしまった場合、宣言部のデータ型を書き換えるのと同時に、変数名まで変更しなければいけないとなると面倒です。一括置換を用いることができるとは言え。 VB6でシステムハンガリアンを用いるとすれば、コントロールやクラスに対して用います。TextBoxであれば、txtHogeだとかhogeTextだとか。コード補完で出てくるプロパティやメソッドに対してあたりをつけやすくなります。 @
https://w.atwiki.jp/jfactory/pages/66.html
いまさらVB6 str 数値を文字列に変換 val 文字列を数値に変換
https://w.atwiki.jp/mini98/pages/25.html
テキストを選ぶコツですが、ここではプログラミング初心者が勉強しやすいと思われるテキストの選び方を紹介します。 著者が日本人である事 著者が日本人である事が第一条件です。もちろん、海外の著者による良書も多くあります。CやC++あたりだと名著と呼ばれる本が存在します。しかし、初心者が勉強するにあたっては、訳本はわかりにくいと思います。翻訳が不十分なのでしょう。わかっている人が読めばそれなりに噛み砕きながら読める本でも、初心者には不向きという事がよくあります。 amazonで評価を確かめる 著者が日本人で、なおかつ、amazonで評価を確かめます。これを繰り返していると…本の評価というより、著者自身の評価が見えてきます。つまり、著者を信頼しろという事なのです。 残念ながら、VB6関係でプログラミング初心者に向いているという本には出会っていません。コントロールの使い方がチョコチョコ解説してある本ならたくさんありますが。コントロールの使い方なんて、憶えるものでもないですし、その場でしか役立ちません。どうせなら、関心の分離に言及して、処理をサブルーチンや関数にどんどん切り分けていく過程まで書いた本とか、ListViewとかTreeViewのユーティリティクラスとかラッパークラスを作って、ポリモーフィズムによって表示までを簡単にするような解説を載せている本とかあればいいのにと思うのですが。 @
https://w.atwiki.jp/hitoshop/pages/12.html
サンプルソース管理をしようと思って、 今まで、仕事やプライベートで使用したのを 誰にも邪魔されずに記録として残していきます. Dim ret As New DialogResult Dim fm As New Form2 ret = fm.ShowDialog() Select Case ret Case Windows.Forms.DialogResult.OK MessageBox.Show(fm.SerchKey) Case Windows.Forms.DialogResult.Cancel MsgBox("キャンセルクリック") End Select End Sub
https://w.atwiki.jp/jfactory/pages/67.html
サンプルコード 自己再起動 空の配列 ビット演算 ファイル 自己再起動 If Not (0 = Shell(App.Path "\" App.EXEName)) Then End 空の配列 C#でいうところの、nullが入った状態のことである。 基本的にVB6では、空っぽの配列を作成することはできない。 しかし、偉大な先人達が、いくつかの方法を見つけている。 null?を入れておく方法 VB6にはnullなどないので、それに変わる方法を使う。 いちおうmsdnにも記載されているらしいが、かなり裏技っぽい Variant型の空の配列を作る Dim arr() As Variant arr = Array() 空っぽの判定 On Error Resume Next If (UBound(arr)) Then Debug.Print "配列は空っぽ" End If String型の空の配列を作る Dim StringArray() As String StringArray = Split("") Byte型の空の配列を作る Dim ByteArray() As Byte ByteArray = "" Object型の空の配列を作る Dim ObjectArray() As Object Call IsArray(ObjectArray) APIを使う方法 Private Declare Function SafeArrayAllocDescriptor Lib "oleaut32" ( _ ByVal cDims As Long, ByRef ppsaOut() As Any) As Long Private Declare Sub GetMem4 Lib "msvbvm60" ( _ ByVal ptr As Long, ByRef ret As Long) 「常に目的のサイズ+1とし、サイズが1を空とみなす方法」 自分的には、読みやすさも考えて、これが好ましいと考える。 Dim arr() As Integer ReDim arr(0) 空っぽの判定(本当は要素数1である) If (UBound(arr) = 0) Then ... End If 要素数を5に変更(本当は要素数6になる) ReDim arr(5) ループ処理(cntは0~4の値となる) Dim cnt As Integer For cnt = 0 To UBound(arr) - 1 ... Next cnt 末尾に要素を追加 ReDim Preserve arr(UBound(arr) + 1) arr(UBound(arr) - 1) = 0 ビット演算 指定位置のバイトを取り出す source 取り出し元 / destination 取り出したデータ Dim source as Long, destination as Long 最下位バイトを取り出す dest = src 0xff destination = source And HFF 2バイト目を取り出す dest = (src 8) 0xff destination = (source / H100) And HFF 3バイト目を取り出す dest = (src 16) 0xff destination = (source / H10000) And HFF 最下位バイトを取り出す dest = (src 24) 0xff destination = (source / H1000000) And HFF ファイル Dim fno as Integer, str As String fno = FreeFile Open "c \sample.txt" For Input As #fno Line Input #fno, str Close #fno
https://w.atwiki.jp/makitosh/pages/34.html
VBからエクセルファイルを開く Private Sub Command1_Click() Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Dim FF1, FF2, FF3 As String On Error GoTo CheckError FF1 = 形式.Text FF2 = "_" ロットNo.Text FF3 = "_" オーダーNo.Text --------------------- EXCELファイルを開く --------------------- Dim strFileName As String ファイル名(フルパス) strFileName = "F \" FF1 FF2 FF3 ".xls" ファイル名をセット Dim strSheetName As String シート名 strSheetName = "Sheet1" シート名をセット Set xlApp = CreateObject("Excel.Application") Application生成 xlApp.Workbooks.Open FileName =strFileName, UpdateLinks =0 EXCELを開く xlApp.Visible = True EXCELの表示 Set xlBook = xlApp.Workbooks(Dir(strFileName)) Workbook Set xlSheet = xlBook.Worksheets(strSheetName) Worksheet Exit Sub CheckError MsgBox strFileName "が見つかりません" Exit Sub End Sub
https://w.atwiki.jp/lookworld/pages/75.html
0. このドキュメントについて この資料では、Visual Basic 6.0から.NETで作成したクラスをCOMとして利用する為の方法について説明する。.NET側の言語はC#を用いるが、他の言語にも応用可能である。 同様の情報が「.NET COM 相互運用」のようなキーワードでネットやヘルプ等の様々な場所に点在しているが、VBから.NETを利用するという観点で通して説明した資料が見つからなかった為、自分なりの解釈でそれらをまとめたものである。 解釈が間違えている箇所もあると思われるので、お気づきの点は shinde@sev.or.jp までご連絡頂ければ幸いである。内容については各自の責任で利用されたい。 目次 1. 最も簡単にVB6から.NETコンポーネントを利用する方法 2. VB6上で実行できるようにする 3. DLLの共有方法 3.1 会社固有のキー・ペアを作成する 3.2 DLLに遅延署名する 3.3 グローバルアセンブリキャッシュ(GAC)に登録する 3.4 VB6から利用できるようにする 3.5 署名を行う 4. その他の問題を解決する 4.1 最新のタイプライブラリを使ってコンパイルすると、実行時エラー429が発生する 4.2 VB6のコード補完が使えない 4.3 イベントをVB6から利用できない 5. 参考文献 1. 最も簡単にVB6から.NETコンポーネントを利用する方法 (1) .NETのDLLを作成する。 まず、VB6から利用したい.NETのクラスをコンパイルし、DLLにする。 DLLにするにはプロジェクトの新規作成時に「クラス ライブラリ」を選択すれば良い。例) DotNetCOMTest.dll DotNetCOMTestClass void TestA() - メッセージボックスを表示する。 このDLLはVB6.exeと同じディレクトリに置いておく。 (2) COMとして利用できるように、レジストリに登録する。 VB6から利用する為に、.NETのDLLをCOMとして利用できるようにレジストリに登録する。 これをやってくれるのがregasmコマンドである。 % regasm DotNetCOMTest.dll ※regasm.exeは、.NET Framework ランタイムに含まれる("WINNT\Microsoft.NET\Framework"以下の各バージョンのフォルダに存在する)。 (3) tlbexp コマンドで、タイプライブラリ(*.tlb)を作成する。 VB6の統合開発環境から利用する為にはタイプライブラリというクラスの型情報を持つファイルが必要である。 これを生成するのがtlbexpコマンドである。% tlbexp DotNetCOMTest.dll /out DotNetCOMTest.tlb ※tlbexp.exeは、.NET Framework SDKに含まれる(\Program Files\Microsoft.Net\ FrameworkSDK\Bin か、VS.NETインストールフォルダ内の同場所に含まれる)。 この結果、同じディレクトリにDotNetCOMTest.tlb が作成される。 (4) VB6のプロジェクトから参照設定する。 VB6の「参照設定」からDotNetCOMTest.tlb を読み込む。 これでVBの統合開発環境上で各クラスを呼び出す準備が整った事になる。 (5) VB6から.Netクラスを生成し、呼び出す。 VB6のフォームにボタンを貼り付け、ボタンのClickイベントに次のようなコード を書く。 尚、クラス名以外のコード補完機能は働かない為注意が必要だ(コード補完機能を使えるようにするには4.を参照)。 VBソースコード(Form1) Private Sub Command1_Click() On Error GoTo Err_Proc Dim obj As DotNetCOMTest.DotNetCOMTestClass (a) Set obj = New DotNetCOMTest.DotNetCOMTestClass (b) Call obj.TestA (c) Exit Sub Err_Proc MsgBox Err.Description End Sub (a) DotNetCOMTestパッケージの、DotNetCOMTestClassの変数objを宣言する。 (b) DotNetCOMTestClassを生成し、objに代入する。 (c) objのTestAメソッドを呼び出す。 (6) プロジェクトをコンパイルし、exeを作成する。 exeを実行してボタンをクリックするとTestAが呼び出される事を確認する。 尚、VB6上から直接実行すると、クラスが見つからない旨のエラーになる。 VB6上から実行できるようにするには2.または3.を行う必要がある。 2. VB6上で実行できるようにする VB6上から直接実行するとエラーになるのは、VB6から実行する際にはカレントフォルダがVB6.exeのフォルダになっており、DLLをVB6が見つけられない為である。 対策は、DLL(ここではDotNetCOMTest.dll)をvb6.exeと同じフォルダにコピーするだけでよい。 ※DotNetCOMTest.dllが参照している他のDLLがあればそれもコピーする。 このやり方でも特に問題はないが、このDLLが他のアプリケーションからも使われる「共有DLL」である場合は3.の対処を行う必要がある。3.の対処を行う場合は2.の対処は不要である。 コラム:共有DLLは必要か? 「3.DLLの共有方法」で説明しているDLLの共有方法は、昔ながらのCOMの共有方法に近い。 しかし、本来.NETの思想ではDLLはそれぞれのアプリケーションにローカルにすべきであり、共有を避けることによって「DLL地獄」に陥らないようにしたり、「XCOPYインストール」を実現したりするのが本筋であろう。 「3.DLLの共有方法」で確かに共有は実現されるが、代償としてそのアプリケーションのインストール時にGACにアクセスしなければならなくなる。GACにアクセスするためのツールであるgacutil.exeは.NET SDKをインストールしなければ存在しない為、VBアプリケーションの配布が非常に面倒になる。 では一般に.NET DLLを利用するVBアプリケーションを配布するにはどうすればいいのかというと、このドキュメントの1.と2.で説明した通り、配布したいVB用アプリケーションのexeと同じフォルダに.NET DLLを配置してregasm.exeを実行すればいいだけである。regasm.exeは.NETランタイムをインストールすれば一緒にインストールされる。 複数のアプリケーションから共有したい場合は、それぞれのアプリケーションフォルダにDLLをコピーすれば良い。一箇所にDLLをまとめたいのであれば、そのVBアプリケーション用の「アプリケーション構成ファイル」を作成してcodebase属性でDLLの位置を指定すれば良い。 「3.DLLの共有方法」は、最後の手段と考えておくべきである。 ※参考:<codebase>属性 http //www.microsoft.com/japan/msdn/library/default.asp? url=/japan/msdn/library/ja/cpgenref/html/gngrfcodebase.asp ※アプリケーション構成ファイルについて ちなみに、アプリケーション構成ファイルは「exe名.config」という名前で作成すればOKだが、これは.NETアセンブリを利用するVBアプリケーションにもそのまま当てはまる。 つまり、「MyVBApp.exe」というVBアプリなら、「MyVBApp.exe.config」という名前で作成すれば良い。codebase属性などについては上記URLを参照のこと。 ※DLLの配布の際は、4.1の問題点についても対処しておくこと。 3. DLLの共有方法 COMの場合、system32フォルダに置いてregsvr32を実行することでDLLを共有できた。 .NETにも共有の仕組みが用意されている。 DLLを共有化すると、どのアプリケーションからでもそのDLLを利用することができる。但し、どうしても共有しなければならない理由がない限り、DLLは各アプリケーションにローカルにしておいた方が良い。 共有化するためにはグローバルアセンブリキャッシュ(GAC)にDLLを登録すれば良い。 しかし、GACに登録する為にはDLLに対して先に「署名」を行うことにより厳密名をつける必要がある。 署名を行う為には「キー・ペア」と呼ばれるものが必要になる。 ここでは開発時のキー・ペアの運用を考慮して、遅延署名と呼ばれるテクニックを用いた手順を詳しく解説する。 この方法はDLLに対して厳密名を付ける方法としても参考にして良い。 尚、既にDLLが完成していて後は共有するだけ、という場合は以下の項目だけを実行すれば良い。 3.1(1) キー・ペアを作成する。 3.2(2) 公開キーを使って遅延署名する。 (※3.1(1)のキー・ペアを使って正式署名をすれば良い) 3.3(2) GACに登録する。 3.4(1) system32フォルダにDLLをコピーする。 3.1 会社固有のキー・ペアを作成する。 (1) キー・ペアを作成する。 % sn.exe -k companyname.snk ※sn.exeは、.NET Framework SDKに含まれる(\Program Files\Microsoft.Net\ FrameworkSDK\Bin に含まれる)。 この結果、カレントフォルダにcompanyname.snkが作成される。 このキー・ペアは他に漏れないよう厳重に保管する必要がある。 また、このキー・ペアは会社固有のキー・ペアとして全てのDLLに対しての署名用に用いる。 3.2 DLLに遅延署名する。 キー・ペアは非常に機密性の高いファイルである為、DLLをコンパイルする度にこのファイルを持ち出していたのでは機密性を保持するのは大変である。 これを回避する為に「遅延署名」というテクニックが用意されている。これはキー・ペアから「公開キー」のみを取り出し、これを使って擬似的に署名を行うものである。 ちゃんとした署名は開発の終了時に行う。 (1) キー・ペアから公開キーを取り出す。 % sn.exe -p companyname.snk companyname_public.snk この結果、companyname_public.snkが作成される。このキーは公開用のキーなので誰に配っても良い。 この後、この公開キーを使ってDLLに「遅延署名」を行う。 コラム: 「キー・ペア」とは何か? 「キー・ペア」とは暗号化方式の一つである「公開鍵暗号化方式」の用語である。 よく知られる「秘密鍵暗号化方式」では一つの暗号化キーを使って暗号化と復号を行うが、公開鍵暗号化方式では「個人鍵」と「公開鍵」という二つの暗号化キーのペアを用いる。 これがキー・ペアと呼ばれる由縁である。 個人鍵を使って暗号化された文書は、対となる公開鍵でしか復号できない。また、公開鍵を使って暗号化された文書は対となる個人鍵でなければ復号できない。 例えばA氏が自分の個人鍵を使って暗号化した文書は、A氏が公開している公開鍵を使ってしか復号できない為、その文書がA氏のものだという証拠となる(もちろん個人鍵は厳重に管理されているという前提がある)。 逆にA氏に秘密の文書を送りたい場合は、送信者がA氏の公開鍵を使って暗号化し、A氏に送れば良い。A氏は自分の個人鍵を使って復号することができるが、他の人がもしこの文書を入手しても復号することはできないのである。 これを署名検証に応用する場合、目的は「対象のアセンブリが正式に署名されたものかを確認する」ことである。その為には、アセンブリ自身に、アセンブリのハッシュをアセンブリの個人鍵で暗号化したものと公開鍵を持たせておけば良い。検証する側は、自分が持っている公開鍵を使ってその暗号文を復号し、それがアセンブリのハッシュと一致すれば、身元が正しい事を証明できる。もちろんこれは、検証する側がそのアセンブリの正しい公開鍵を事前に知っている場合に限られる。(実際にはもっと複雑な手順を踏んでいると思われる)。 (2) 公開キーを使って遅延署名を行う。 公開キー(companyname_public.snk)をプロジェクト(又はソリューション)フォルダに配置する。 VS.NETのプロジェクト(又はソリューション)を開き、AsemblyInfo.cs に以下の記述を追加する。 AssembyInfo.cs(一部) [assembly AssemblyDelaySign(true)] // falseにすると正式に署名される。 [assembly AssemblyKeyFile(@"..\..\..\companyname_public.snk")] これでコンパイルすれば、DLLに遅延署名がされる。 尚、AssemblyKeyFile属性はDLLの出力先からの相対パスとなるので、各環境に合わせて変更しなければならない。 また、署名された(厳密名を持った)DLLは厳密名を持ったDLLしか参照できない為、必要ならばそれらも署名する必要がある。 3.3 グローバルアセンブリキャッシュ(GAC)に登録する。 (1) 署名検証機能をオフにする。 遅延署名されたDLLは公開キーを持っているだけで、実際には有効な署名がされているわけではない。よって、DLLのロード時の署名検証時にエラーとなって しまう。 以下の方法で.NET Frameworkの署名検証機能をオフにする必要がある。この処理は.NET Frameworkに対して行われるものであり、DLLそのものに何らかの変更がされる訳ではない。よって、オフにしたい全ての環境でこれを実行しなければならない。% sn.exe -Vr DotNetCOMTest.dll ところで、「こんなことができるのなら、遅延署名など使わず最初から署名検証機能をオフにすればよかったのに」と思う人がいるかもしれないが、なんらかの形で署名されていないとGACへの登録そのものができない為、面倒だがしょうがない。 (2) グローバルアセンブリキャッシュ(GAC)に登録する。 % gacutil -i DotNetCOMTest.dll ※gacutil.exeは、.NET Framework SDKに含まれる(\Program Files\Microsoft.Net\ FrameworkSDK\Bin に含まれる)。 尚、登録解除は以下の通り。 % gacutil -u DotNetCOMTest DLLから参照している他のDLLがあるならば、全てGACに登録しなければならない。 3.4 VB6から使用できるようにする。 (1) system32フォルダにDLLをコピーする。 DLLを、system32フォルダ(又はパスが通っているフォルダ)にコピーする。 その後、1.と同様の処理を行えばよい。 3.5 署名を行う。 遅延署名されたDLLは出荷前にちゃんとしたキー・ペアを使って署名しなければならない。 (1) 遅延署名DLLへ署名する。 % sn.exe -Rc DotNetCOMTest.dll companyname.snk (2) 署名検証機能をオンにする。 開発環境においては必ずしも行う必要はないが、正式に署名されたDLLの署名検証 機能をオンに戻すのは以下の方法で行う。% sn.exe -Vu DotNetCOMTest.dll 4. その他の問題を解決する 4.1 最新のタイプライブラリを使って再コンパイルすると、実行時エラー429が発生する。 DLL側の開発中は、頻繁にDLLそのものやタイプライブラリが更新されることになる。 ところが更新されたタイプライブラリをVBに読み込んで再コンパイルしたexeを実行すると、実行時エラー429が発生する場合がある。 regasmを使ってDLLを再登録するとこのエラーは起こらなくなる。しかし、DLLが更新されるたびにregasmを行っていたのでは非常に面倒であるし、配布もしづらい。 これは以下のような理由から起こる。 タイプライブラリを生成すると、クラスの固有キーがCLSIDとして生成され、タイプライブラリに埋め込まれる。既定ではこのCLSIDは毎回違うものになる為、タイプライブラリに埋め込まれるCLSIDも毎回異なることになる。 regasmによってレジストリに登録される.NETクラスのキーはこのCLSIDであり、exeはこのCLSIDを用いて.NETクラスを探しに行く。最新のタイプライブラリ(つまり新しいCLSID)を使ってコンパイルされたexeがいくらレジストリを探しても、まだregasmされていない.NETクラスは見つけられないのである。 これを回避する為にはクラスやインターフェイスに対してGUID属性を指定すれば良い。 [GuidAttribute("25731EF3-88ED-4322-9A90-E665598A4889") ] public class Person IPerson { ※GUIDは、[ツール]メニューから「GUIDの生成」を使って生成できる。 これによりCLSIDは固定となり、いちいちregasmを行う必要はなくなる。 4.2 VB6のコード補完が使えない。 そのままの設定だと.NETのクラスに対してはVB6のコード補完が働かない。これについては以下のように対処可能であるが、いくつか問題もある。 (1) ClassInterface属性にClassInterfaceType.AudoDualを設定する。 [ClassInterfaceAttribute(ClassInterfaceType.AutoDual)] public class Person この属性値を指定すると、そのクラスのメンバが全てVB6のコード補完から使えるようになる。 具体的にはAutoDualは全てのメンバのインターフェイスをタイプライブラリに記述する、つまり事前バインディングを可能にする指定である。 しかしこれには重大な欠点がある。そのクラスのメンバのレイアウト(メンバの順番など)を変更すると、事前バインディングのインターフェイスも変わってしまうのだ。例えばクラスのメンバAとBの間にメンバXを加えたら、それまで動いていたアプリケーションが全て動かなくなってしまう。メンバAとBの順番を変えただけでも同様の結果になる。毎回全てのアプリケーションを再コンパイルするのは、開発時は問題ないとしても、一旦リリースしてしまった場合などは困難である。 開発時のみの属性値だと思った方が良さそうである。(MSも、この属性値は「推奨しない」と言っている) (2) ClassInterface属性にClassInterfaceType.AutoDispachを設定する。 [ClassInterfaceAttribute(ClassInterfaceType.AutoDispatch)] public class Person この属性値を指定してもコード補完は働かない。それもそのはず、この属性値は既定値だからである。何も指定しなければ自動的にAutoDispatchとなる。 具体的にはAutoDispatchは全てのメンバのインターフェイスをタイプライブラリに「記述しない」、つまり事前バインディングをできないようにする指定である。逆に言えば、遅延バインディング(実行時バインディング)に限定することになる。 こうする事には理由がある。(1)の説明を読めばお分かりと思うが、事前バインディングを用いるとクラスのレイアウト変更に非常に弱くなってしまうからである。事前バインディングでなく遅延バインディングを用いることで、クラスのレイアウト変更とは完全に切り離すことができる。 (3) ClassInterface属性にClassInterfaceType.Noneを設定する。 [ClassInterfaceAttribute(ClassInterfaceType.None)] public class Person IPerson コード補完は使いたい、でもAutoDualは問題がある・・・このちょうど中間がNoneである。 Noneは、そのクラスが実装しているインターフェイス(ここではIPerson)のみを事前バインディング可能にする指定である。これだけならAutoDualと同じ問題が起きそうだが、Noneの良いところはクラス側のレイアウト変更が外部に影響を及ぼさない点である。IPersonのレイアウトのみが外部に影響する。 よって、Noneを用いるのは「COM公開用のインターフェイスが決まっており、今後も変更しない事が決まっている場合」 に限られる。これはCOMの思想と合致しており、あくまでもCOMとして利用するためのDLLであればこれで問題ないと思われる。 4.3 イベントをVB6から利用できない。 .NETのクラスでイベントを発生させ、VBのクライアントからそれを受け取る・・・いかにも楽しそうなこのテクニックが、単に.NETのクラスにeventを定義しただけでは行えない。 VB側でWithEventsステートメントを使っても、そもそもコード補完のリストに該当のクラスが現れないのである。 イベントの利用はなぜか面倒な手続きが必要となっている。 まず、そのイベントと同じ引数と名前のメソッドを持つインターフェイス(ここではPersonEvents)を定義し、以下のような属性を指定する。 public delegate void PersonEventHandler( string name );[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)] public interface PersonEvents { void NameChanged( string name ); } public class Person { public event PersonEventHandler NameChanged; 次に、ComSourceInterfaces属性を使ってクラス側にそのインターフェイス名を指定する。 public delegate void PersonEventHandler( string name ); [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)] public interface PersonEvents { void NameChanged( string name ); }[ComSourceInterfaces("DotNetCOMTest.PersonEvents, DotNetCOMTest")] public class Person { public event PersonEventHandler NameChanged; ComSourceIntarfaces属性値の引数は、最初がイベント用に定義したインターフェイス名、二番目がそのインターフェイスが存在するアセンブリ名である。 これでVB6からイベントを利用できるようになる。 5. 参考文献 Microsoft .NET Framework SDK クイックスタートチュートリアルhttp //ja.gotdotnet.com/quickstart/default.aspx 解説 インサイド .NET Framework (@IT記事)http //www.atmarkit.co.jp/fdotnet/technology/index/index.html 高度なCOM相互運用機能 - クラス インターフェイスの概要 http //www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/ cpguide/html/cpconintroducingclassinterface.asp 高度なCOM相互運用機能 - COMシンクによって処理されるイベントの発生 http //www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/ cpguide/html/cpconraisingeventshandledbycomsink.asp 著者: 株式会社アイジュピタ 新出 純壱( shinde@sev.or.jp )
https://w.atwiki.jp/mytips/pages/38.html
(VB6)マウスホイールを使えるようにする http //support.microsoft.com/kb/837910/ja MSのサポートページよりDLLをダウンロードしてレジストリ登録し、VB6のアドインとしてロードさせると、IDEでマウスホイールが使えるようになる。 IntelliPointのバージョンを下げる(4.9-- 4.12)という方法も併記されているが、それでは何をバージョンアップしたのだ?
https://w.atwiki.jp/wiki15_ryugen/pages/5.html
未作成